הרצאה 18 - עץ פורש מינימלי
עצים (Trees):
- עץ הוא גרף לא מכוון, קשיר וחסר מעגלים (אציקלי).
- תנאים שקולים לעץ: בגרף לא מכוון
, התנאים הבאים הם שקולים: - ש
הוא עץ. - ש
ו- אינו מכיל מעגלים. - ש
ו- קשיר. - שלכל זוג קודקודים בגרף ישנו מסלול פשוט יחיד ביניהם.
- ש
- הוספת והסרת צלעות:
- אם נוסיף לעץ צלע חדשה
, הגרף החדש יכיל בדיוק מעגל פשוט אחד שעובר דרך הצלע . - אם נסיר מאותו מעגל כל צלע אחרת
, הגרף יחזור להיות עץ מחדש.
- אם נוסיף לעץ צלע חדשה
בעיית העץ הפורש המינימלי (Minimum Spanning Tree - MST):
- קלט הבעיה: גרף קשיר ולא מכוון
יחד עם פונקציית משקל לצלעות . - מטרת הבעיה: למצוא תת-גרף
של המקיים: - ש -
הוא עץ. - שסכום המשקלים של הצלעות ב-
, כלומר , הוא מינימלי.
- ש -
- עץ המקיים את שני התנאים הללו מוגדר כעץ פורש מינימלי.

האלגוריתם הגנרי למציאת MST:
-
מתחזק קבוצת צלעות
שהיא תת-קבוצה של עץ פורש מינימלי כלשהו. האלגוריתם מוסיף בכל שלב צלע שהיא בטוחה עבור : - כלומר כזו שהוספתה ל-
משאירה את כחלק מעץ פורש מינימלי.
- כלומר כזו שהוספתה ל-
-
מושגי יסוד למציאת צלע בטוחה:
- חתך:
- חלוקה של קודקודי הגרף לשתי קבוצות זרות.

- צלע חוצה חתך אם קצה אחד שלה נמצא בקבוצה אחת והשני בקבוצה השניה.
- חתך מכבד קבוצת צלעות
אם אף צלע מתוך לא חוצה את החתך. - צלע קלה:
- מתוך כל הצלעות שחוצות את החתך, זוהי הצלע בעלת המשקל המינימלי.

- חתך:
-
משפט מציאת צלע בטוחה: אם
היא תת-קבוצה של MST כלשהו, קיים חתך שמכבד את , והצלע היא צלע קלה שחוצה את החתך, אזי היא צלע בטוחה עבור .
אלגוריתם קרוסקל (Kruskal's Algorithm):
- אלגוריתם הבונה את העץ באמצעות בחירת צלעות מהקלה אל הכבדה, תוך הימנעות מיצירת מעגלים. התהליך מתבצע על ידי מיזוג רכיבי קשירות עד לקבלת עץ יחיד.
- אופן הפעולה:
- מאתחלים את
כקבוצה ריקה, ויוצרים קבוצה נפרדת לכל קודקוד בגרף. - ממיינים את כל קבוצת הצלעות
בסדר לא-יורד של משקלים. - עוברים על הצלעות הממוינות. עבור כל צלע
, בודקים האם הקודקודים שייכים לקבוצות שונות בעזרת (כדי למנוע מעגל). - אם הם מקבוצות (עצים) שונות, הצלע בטוחה. נוסיף אותה ל-
ונאחד את הקבוצות. 

- מאתחלים את
- סיבוכיות זמן:
- מיון הצלעות לוקח
. - תחזוקת מבנה הנתונים Disjoint Sets (יצירת קבוצות, חיפוש ואיחוד) לוקחת
. - סך הכל סיבוכיות זמן הריצה היא
. במקרה שהצלעות מגיעות ממוינות מראש, הסיבוכיות תהיה .
- מיון הצלעות לוקח
אלגוריתם פרים (Prim's Algorithm):
- אלגוריתם זה עובד בצורה שונה - במקום לגדל יער של עצים שמתחברים, הוא מגדל עץ אחד יחיד שמתחיל מקודקוד שרירותי
ומתפשט החוצה על ידי הוספת צלעות קלות. - מבנה הנתונים:
- האלגוריתם מנהל תור עדיפויות המכיל את כל הקודקודים שטרם צורפו לעץ. העדיפות בתור נקבעת לפי משקל הצלע הקלה ביותר שמחברת את הקודקוד אל העץ הנבנה.
- עבור כל קודקוד שומרים גם שדה אבא (
) כדי לשחזר את העץ בסוף.
- אופן הפעולה:
- מאתחלים את תור העדיפויות כך שקודקוד המקור
יקבל מפתח 0 (שיישלף ראשון) ושאר הקודקודים מקבלים מפתח אינסוף ( ). - בכל איטרציה, מוציאים מתור העדיפויות את הקודקוד
עם הערך המינימלי. - עוברים על כל השכנים
של . אם עדיין בתוך התור, והמשקל קטן מהערך הנוכחי שלו ( ), אז מעדכנים את ערכו להיות משקל הצלע בתור ומעדכנים את שדה האבא שלו ( ). 

- מאתחלים את תור העדיפויות כך שקודקוד המקור
- סיבוכיות זמן:
- בניית תור העדיפויות והאתחול לוקחים
. - שליפת המינימום מהתור מתבצעת
פעמים בעלות כוללת של - עדכון ערכי הקודקודים מתבצע לכל היותר כפעמיים לכל צלע, בעלות כוללת של
. - סך הכל סיבוכיות זמן הריצה היא
.
- בניית תור העדיפויות והאתחול לוקחים